// 登录拦截器
const authManager = require('./auth')

/**
 * 页面登录拦截器
 * 在页面的onLoad或onShow中调用，自动检查登录状态
 */
function loginInterceptor(options = {}) {
  const {
    required = true,        // 是否必须登录
    showToast = true,       // 是否显示提示
    toastText = '请先登录', // 提示文本
    redirectDelay = 1500    // 跳转延迟
  } = options

  if (!required) {
    return true
  }

  if (!authManager.isLoggedIn()) {
    if (showToast) {
      wx.showToast({
        title: toastText,
        icon: 'none',
        duration: redirectDelay
      })
    }

    setTimeout(() => {
      wx.navigateTo({
        url: '/pages/login/index'
      })
    }, showToast ? redirectDelay : 0)

    return false
  }

  return true
}

/**
 * 为页面添加登录检查方法
 */
function addLoginCheck(pageOptions, interceptorOptions = {}) {
  const originalOnLoad = pageOptions.onLoad
  const originalOnShow = pageOptions.onShow

  // 重写onLoad方法
  pageOptions.onLoad = function(options) {
    // 执行登录检查
    const loginResult = loginInterceptor(interceptorOptions)
    
    // 如果登录检查通过，执行原始onLoad
    if (loginResult && originalOnLoad) {
      originalOnLoad.call(this, options)
    }
  }

  // 重写onShow方法
  pageOptions.onShow = function() {
    // 执行登录检查
    const loginResult = loginInterceptor({
      ...interceptorOptions,
      showToast: false // onShow时不显示toast
    })
    
    // 如果登录检查通过，执行原始onShow
    if (loginResult && originalOnShow) {
      originalOnShow.call(this)
    }
  }

  return pageOptions
}

/**
 * 功能点击登录检查
 */
function checkLoginForAction(callback, options = {}) {
  if (authManager.isLoggedIn()) {
    if (typeof callback === 'function') {
      callback()
    }
    return true
  } else {
    const {
      showToast = true,
      toastText = '请先登录'
    } = options

    if (showToast) {
      wx.showToast({
        title: toastText,
        icon: 'none',
        duration: 1500
      })
    }

    setTimeout(() => {
      wx.navigateTo({
        url: '/pages/login/index'
      })
    }, showToast ? 1500 : 0)

    return false
  }
}

module.exports = {
  loginInterceptor,
  addLoginCheck,
  checkLoginForAction
}